#!/bin/bash
#################################################################
# @Description: 用例名称：VM虚拟机管理，测试目的：在KVM虚拟机上安装部署操作系统，创建两台虚拟机

source "../common.sh"
export LANG=en_US.UTF-8
res=0

iso_path=$1
[[ "$iso_path" =~ "/root" ]] && \cp "$iso_path" /opt &>/dev/null && iso_path_2="/opt/$(basename $iso_path)" || iso_path_2=$iso_path
chmod 777 $iso_path_2
# 预置条件
# 关闭防火墙(虚拟机获取ip需要关闭防火墙)
firewall_status=$(systemctl is-active firewalld) 
# 如果防火墙处于运行状态，则停止并禁用防火墙
if [ "$firewall_status" == "active" ]; then
    echo "防火墙处于运行状态，正在停止并禁用..."
    systemctl stop firewalld
    systemctl disable firewalld
    echo "防火墙已停止并禁用."
else
    echo "防火墙未处于运行状态，无需操作."
fi
# 安装qemu，libvirt，bridge-utils，net-tools python python3-libvirt edk2-aarch64部署kvm
yum install -y libvirt qemu bridge-utils net-tools python python3-libvirt edk2-aarch64 >/dev/null || res=1
# 启动libvirtd服务
systemctl start libvirtd || res=1

password=$2
echo "$password" > "../passwd.txt"
cleanup_environment >/dev/null
# 测试步骤
# 准备所有准备xml文件，拷贝至host主机（如/opt下）
\cp ../xml/*.xml /opt/ 
vm1_name="vm1"
vm2_name="vm2"
echo "1.准备${vm1_name}.xml文件，拷贝至host主机（如/opt下）"
vm1_xml="/opt/${vm1_name}.xml"

echo "2.准备os镜像iso文件，拷贝至host主机（如/opt下）"
#将iso的路径写入vm1.xml中
echo "3.${vm1_xml}文件修改disk中crdorm 的iso路径（/opt/xxx.iso）"
sed -i "/<disk type='file' device='cdrom'>/,/<\/disk>/ s#<source file='\$iso_path'/>#<source file='$iso_path_2'/>#" "$vm1_xml" || res=1
   
echo "$vm1_xml 关键配置为:"
cat $vm1_xml |grep cdrom -A6
if [ $? -ne 0 ]; then
  echo "can not find $iso_path_2 in $vm1_xml"
  exit 1
fi

# host主机/opt下创建qcow2文件
echo "4.创建虚拟机${vm1_name} qcow2磁盘文件"
[ ! -f /opt/${vm1_name}.qcow2 ] && qemu-img create -f qcow2 /opt/${vm1_name}.qcow2 100G && echo "虚拟机${vm1_name} qcow2磁盘文件创建成功"
# 定义虚拟机vm1
echo "5.定义虚拟机${vm1_name}，执行virsh define $vm1_xml"
define_output=$(virsh define $vm1_xml )
if [ $? -ne 0 ]; then
    echo "定义虚拟机时出错。错误信息：$define_output"
    echo "可能的原因："
    echo "1. XML配置文件的语法和结构是否正确？"
    echo "2. 是否有读取$vm1_xml文件的权限？"
    echo "3. 是否存在同名的虚拟机？"
    echo "4. Libvirt服务是否正在运行？"
    exit 1
fi

# 启动虚拟机vm1
echo "6.启动虚拟机${vm1_name}，执行virsh start ${vm1_name}"
start_output=$(virsh start ${vm1_name} )
if [ $? -ne 0 ]; then
    echo "启动虚拟机时出错。错误信息：$start_output"
    echo "可能的原因："
    echo "1. 虚拟机定义是否正确？"
    echo "2. 虚拟机状态是否正确？"
    echo "3. Libvirt 服务是否正在运行？"
    exit 1
fi
echo "虚拟机$vm1_name启动成功。"

# 查看vnc号，使用vnc客户端连接虚拟机
echo "7.获取虚拟机vnc号，执行virsh vncdisplay $vm1_name"
vncport=$(virsh vncdisplay $vm1_name)
echo -e "\033[32m请使用VNC工具去安装系统（通过物理机IP:VNC端口号连接），VNC端口号为$vncport\033[0m"
echo -e "\033[32m安装完后执行ifup enp3s0（网卡名可通过ip addr获取），启动网卡使虚拟机获取IP\033[0m"
echo "等待获取$vm1_name的IP..."
while true; do
    ip_vm1=$(get_vm_ip $vm1_name)
    # 如果有IP地址，打印IP信息
    if [ -n "$ip_vm1" ]; then
        check_and_ping $ip_vm1
        if [ $? -eq 0 ]; then
            echo "虚拟机$vm1_name IP:$ip_vm1 启动正常！"
        else
            echo "虚拟机$vm1_name启动失败！"
            res=1
        fi
        break  # 退出循环
    fi
    sleep 10
done

# 网卡开机自启配置
yum install -y sshpass >/dev/null || res=1
sshpass -p "$password" ssh -o StrictHostKeyChecking=no -q $ip_vm1 "sed -i 's/ONBOOT=no/ONBOOT=yes/' /etc/sysconfig/network-scripts/ifcfg-*" > /dev/null 2>&1
sshpass -p "$password" ssh -o StrictHostKeyChecking=no -q $ip_vm1 "sync" > /dev/null 2>&1
sleep 5 

virsh destroy $vm1_name
echo "8.开始创建第二台虚拟机vm2"
# 使用复制的方法，将vm1的qcow2文件复制到/opt下，启动vm2
echo "${vm2_name}虚拟机克隆中......"
\cp /opt/${vm1_name}.qcow2 /opt/${vm2_name}.qcow2
echo "${vm2_name}虚拟机文件克隆完成"
virsh start $vm1_name >/dev/null
echo "重新启动${vm1_name}虚拟机"
vnc_port1_1=$(virsh vncdisplay $vm1_name)
#创建并启动vm2
virsh define /opt/${vm2_name}.xml  >/dev/null || res=1
echo "开始启动${vm2_name}"
virsh start $vm2_name  >/dev/null || res=1
sleep 20
vnc_port2=$(virsh vncdisplay $vm2_name)
# 循环查询虚拟机的 IP 地址
echo "等待$vm2_name启动中..."
while true; do
    ip_vm2=$(get_vm_ip $vm2_name)
    # 如果有 IP 地址，打印信息并写入文件
    [ -n "$ip_vm2" ] && break 
    sleep 10
done

# 检查并 ping 的 IP 地址
check_and_ping $ip_vm2 && echo "虚拟机$vm2_name IP: $ip_vm2启动正常！" || res=1
# 判断用例是否执行成功
[ "$res" = "0" ] && echo -e "\033[32m-----------------test PASSED----------------\033[0m" || echo -e "\033[31m-----------------test FAILED----------------\033[0m"
[ "$res" = "0" ] && echo "请手动执行6.1.14.2用例 测试步骤如下： 
1.在主机上打开终端或命令提示符，输入以下命令以确认SSH服务是否正在运行：
systemctl status sshd，有预期结果1。
2.使用 VNC 客户端连接虚拟机vm1，VNC端口为$vnc_port1_1（输入，如192.168.0.1$vnc_port1_1）。
3.使用虚拟机vm1连接到主机。
命令格式如下：
ssh [主机用户名]@[主机IP地址]
例如：
ssh root@192.168.122.1
按照命令行的提示，输入正确root用户的密码。

预期结果：
1.预期结果：命令输出显示SSH服务正在运行。
2.步骤3，虚拟机vm1连接主机成功。
"
